
/*
	链表的操作
	作者：zzm
	修改日期:2014.10.31
*/ 

#include<stdio.h>
#include<malloc.h>
#define LEN sizeof(student *)
typedef struct stu
{
	int num;
 	struct stu *next;
}student;

//主函数 
int main()
{
	int del,add;
	student *head;
	student *create(void);//声明创建链表函数
	void print(student *);//声明输出链表函数
	student *dellist(student *,int);//声明删除链表某元素的函数
	student *addlist(student *,int);//声明从链表尾部添加元素的函数 
	//student *appoint_add_list(student *,int,int);//声明在指定位置添加元素 
	head=create();
	print(head);
	printf("input del:");
	scanf("%d",&del);
	head=dellist(head,del);
	print(head);
	printf("input add:");
	scanf("%d",&add);
	head=addlist(head,add);
	print(head);
	return 0;
}

//创建链表 
student *create(void)
{
	int n=0;
	student *p1,*p2,*head;
	p1=p2=(student *)malloc(LEN);
	head=NULL;
	printf("input %d:",n+1);
	if(scanf("%d",&p1->num)==EOF)return NULL;
	while(1)           
	{
		n++;
		if(n==1)head=p1;
		else p2->next=p1;
		p2=p1;
		p1=(student *)malloc(LEN);
		printf("input %d:",n+1);
		if(scanf("%d",&p1->num)==EOF)break;
	}
	p2->next=NULL;
	return head;
}
//链表的输出 
void print(student *head)
{
	int num=0;
	student *p;
	if(head==NULL){
		printf("没任何元素!\n");
		return;
	}
	p=head;
	while(p!=NULL)  //循环链表输出 
	{
		num++;
		printf("%d:  %d\n",num,p->num);
		p=p->next;
	}
}

//删除链表的某个元素 
student *dellist(student *h,int n)
{
	int num=0;
	student *p1,*p2;
	if(h==NULL){
		return 0;
	}
	p1=h;
	while(p1->num!=n)
	{	
		p2=p1;
		p1=p1->next;
		num++;
	}
	if(num==0)h=p1->next;//如果删除第一个就直接把头指针指向下一个 
	else{
		p2->next=p1->next;//前驱指针的next指向后驱指针的next 
	}
		
	return h;
}
//在链表尾部增加一个元素 
student *addlist(student *h,int num)
{
	student *p,*p2;
	if(h==NULL){
		return 0;
	}
	p=h;	
	while(p!=NULL)
	{
		p2=p;
		p=p->next;
	}
	p=(student *)malloc(LEN);//在尾部开辟内存 
	p2->next=p;  //把原来的链表尾指向新开辟的内存 
	p->num=num;
	p->next=NULL;
	return h;
}
/*
student *appoint_add_list(student *head,int num,int i)//i为插入位置，num为插入元素
{
	
	return head;
} */


